package com.hltx.service.user.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.hltx.mapper.user.UserMapper;
import com.hltx.pojo.business.BusinessInfo;
import com.hltx.pojo.user.Group;
import com.hltx.pojo.user.SMessage;
import com.hltx.pojo.user.User;
import com.hltx.pojo.user.UserAccount;
import com.hltx.pojo.user.UserLogin;
import com.hltx.service.user_dubbo.UserManager;
import com.hltx.util.CustomUtil;
import com.hltx.util.HttpClientManager;
import com.hltx.util.MD5Util;

import net.sf.json.JSONObject;

import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * 
 * @author admin
 * @version 2017.06.09 10:00
 * 
 */
@Component("userServiceD")
@Service (protocol = "dubbo", loadbalance = "roundrobin")
public class UserService implements UserManager {

    @Autowired
    private UserMapper userMapper;

    /**
     * . 获取当前用户的信息
     */
    @Override
    public User getUser(int id) {
        return userMapper.getUser(id);
    }

    /**
     * . 根据用户名密码获取当前登录人的信息
     */
    @Override
    public UserLogin userLogin(UserLogin user) {
        return userMapper.userLogin(user);
    }

    /**
     * . 根据登录id获取登录人详细信息
     */
    @Override
    public Map<String, Object> getLoginInfo(int loginId) {
        return userMapper.getLoginInfo(loginId);
    }

    /**
     * . 修改密码
     */
    @Override
    public String updatePwd(int id, String oldPwd, String newPwd,String userName,String clientid,String clientSecret,String orgName,String appName){
		UserLogin login = userMapper.getUserById(id);
		System.out.println("login" + login.getPwd());
		if (MD5Util.MD5(oldPwd).equals(login.getPwd())) {
			String pwd = MD5Util.MD5(oldPwd);
			String Npwd = MD5Util.MD5(newPwd);
			login.setPwd(Npwd);
			User user = new User();
			user.setPwd(pwd);
			user.setUserName(userName);
			String hxId = userMapper.getHxId(user);
			Map<String, Object> nmap = new HashMap<>();
			nmap.put("newpassword", Npwd);
			if(hxId != null){
				String massage = HttpClientManager.updateHxPwd(hxId, nmap,clientid,clientSecret,orgName,appName);
				JSONObject jsonO = JSONObject.fromObject(massage);
				Map<String, Object> mapJson = JSONObject.fromObject(jsonO);
				String action = (String) mapJson.get("action");
				if (action != null && action != "") {
					userMapper.updateUserPwd(login);
				}else{
					return "3";
				}
			}else{
				userMapper.updateUserPwd(login);
			}
			return "1";
		} else {
			return "2";
		}
	}

    /**
     * . 找回密码 （因为找回密码是在没有登录的情况下进行修改密码的 只能根据用户名 进行修改）
     */
    @Override
    public void updateNewsPwd(UserLogin login) {
        userMapper.updateNewsPwd(login);
    }

    /**
     * . 修改昵称
     */
    @Override
    public void saveName(Integer id, String petName) {
        User user = new User();
        user.setId(id);
        user.setPetName(petName);
        userMapper.saveName(user);
    }

    /**
     * . 修改性别
     */
    @Override
    public void updateSex(Integer id, String sex) {
        User user = new User();
        user.setId(id);
        user.setSex(sex);
        userMapper.updateSex(user);
    }

    /**
     * . 添加登录信息（账号密码）
     */
    @Override
    public int saveUser(User user) {
        return userMapper.saveUser(user);
    }

    /**
     * . 保存userInfo信息
     */
    @Override
    public int saveUserInfo(User user) {
        return userMapper.saveUserInfo(user);
    }

    /**
     * . 修改生日日期
     */
    @Override
    public void updateDay(Integer id, String birthday) {
        User user = new User();
        user.setId(id);
        user.setBirthday(birthday);
        userMapper.updateDay(user);
    }

    /**
     * 根据登录名和密码查询环信的id
     * @param user
     * @return
     */
    @Override
	public String getHxId(User user) {
		return userMapper.getHxId(user);
	}
    
    @Override
    public int saveUserRegister(UserLogin login) {
        User user = null;
        userMapper.saveUserLogin(login);
        // 添加用户表 hltx_user_info
        user = new User();
        SimpleDateFormat format = new SimpleDateFormat("yyyy");
        String year = format.format(new Date());
        user.setCodePre(year);
        user.setCodeSuf(CustomUtil.buildRandom(3) + "");
        user.setLoginId(login.getId());
        user.setPhone(login.getUserName());
        String petName = user.getPhone().substring(0, 3) + "****"
                + user.getPhone().substring(user.getPhone().length() - 4, user.getPhone().length());
        user.setPetName(petName);
        user.setAddress("");
        user.setCreationDate("");
        user.setBirthday("");
        user.setLevel("0");
        user.setIsSupplier("00");
        userMapper.saveUserInfo(user);
        UserAccount account = new UserAccount();
        account.setUserId(user.getId());
        account.setLoginId(login.getId());
        account.setBalance(new BigDecimal(0));
        account.setPoints(0);
        account.setIsPublic("00");
        userMapper.saveUserAccount(account);
        // 这里只能是好友邀请注册的时候才有的
        if (login.getFriend() != null) {
            User puser = new User();
            puser.setPhone(login.getFriend());
            String parentId = userMapper.getUserByPhone(puser);
            user.setFirendId(Integer.parseInt(parentId));
            userMapper.saveRelation(user);
        }
        if (user.getLoginId() > 0) {
            return user.getLoginId();
        } else {
            return -1;
        }
    }

    
    @Override
	public void saveUserRegister1(UserLogin login, int id,String clientid,String clientSecret,String orgName,String appName) {
		User user = new User();
		Map<String, Object> userMap = new HashMap<String, Object>();
		userMap.put("password", login.getPwd());
		userMap.put("username", login.getHxId());
		String appData = HttpClientManager.HxRegister(userMap,orgName,appName,clientid,clientSecret);
		JSONObject jsonObject = JSONObject.fromObject(appData);
		Map<String, Object> mapJson = JSONObject.fromObject(jsonObject);
		String uri = (String) mapJson.get("uri");
		if (uri != null && !"".equals(uri)) {
			user.setHxId(login.getHxId());
			user.setLoginId(id);
			userMapper.saveHxId(user);
		}

	}
	
	@Override
	public int saveUserRegister2(UserLogin login,String orgName,String appName,String clientid,String clientSecret) {

		User user = null;
		// 添加登录表 hltx_user_login
		userMapper.saveUserLogin(login);
		// 添加用户表 hltx_user_info
		user = new User();
		SimpleDateFormat format = new SimpleDateFormat("yyyy");
		String year = format.format(new Date());
		user.setCodePre(year);
		user.setCodeSuf(CustomUtil.buildRandom(3) + "");
		user.setLoginId(login.getId());
		user.setPhone(login.getUserName());
		String petName = user.getPhone().substring(0, 3) + "****"
				+ user.getPhone().substring(user.getPhone().length() - 4, user.getPhone().length());
		user.setPetName(petName);
		user.setAddress("");
		user.setCreationDate("");
		user.setBirthday("");
		user.setLevel("0");
		userMapper.saveUserInfo(user);
		UserAccount account = new UserAccount();
		account.setUserId(user.getId());
		account.setLoginId(login.getId());
		account.setBalance(new BigDecimal(0));
		account.setPoints(0);
		userMapper.saveUserAccount(account);
		if (login.getFriend() != null) {
			User pUser = new User();
			pUser.setPhone(login.getFriend());
			String parentId = userMapper.getUserByPhone(pUser);
			user.setFirendId(Integer.parseInt(parentId));
			userMapper.saveRelation(user);
		}
		if (user.getLoginId() > 0) {
			// 注册环信用户
			Map<String, Object> userMap = new HashMap<String, Object>();
			userMap.put("password", login.getPwd());
			userMap.put("username", login.getHxId());
			String appData = HttpClientManager.HxRegister(userMap,orgName,appName,clientid,clientSecret);
			JSONObject jsonObject = JSONObject.fromObject(appData);
			Map<String, Object> mapJson = JSONObject.fromObject(jsonObject);

			String uri = (String) mapJson.get("uri");

			if (uri != null && !"".equals(uri)) {
				// 环信用户同步到数据库 hx_app_user
				User users = new User();
				users.setHxId(login.getHxId());
				users.setLoginId(user.getLoginId());
				userMapper.saveHxId(users);
				return user.getLoginId();

			} else {
				return -2;
			}

		} else {
			return -1;
		}

	}
    
    /**
     * 更改图片地址
     */
    @Override
    public void uploadimageAddress(Integer id, String imageAddress) {
        User user = new User();
        user.setId(id);
        user.setImageAddress(imageAddress);
        userMapper.updateloadimageAddress(user);
    }

    /**
     * 根据登录id查询用户详情
     */
    @Override
    public User getUserInfo(int id) {
        return userMapper.getUserInfo(id);
    }

    /**
     * 在hltx_user_login表中添加数据信息
     */
    @Override
    public void saveUserLogin(UserLogin login) {
        userMapper.saveUserLogin(login);
    }

    @Override
    public int saveAppUser(UserLogin login, User us) {
    	userMapper.saveUserLogin(login);

		User user = new User();
		SimpleDateFormat format = new SimpleDateFormat("yyyy");
		String year = format.format(new Date());
		user.setCodePre(year);
		user.setCodeSuf(CustomUtil.buildRandom(3) + "");
		user.setLoginId(login.getId());
		user.setPhone(login.getUserName());
		user.setAddress(us.getAddress());
		user.setBirthday(us.getBirthday());
		// String petName =user.getPhone().substring(0,
		// 3)+"****"+user.getPhone().substring(user.getPhone().length()-4,
		// user.getPhone().length());
		user.setPetName(us.getPetName());
		String hxId = "hltx" + MD5Util.MD5(login.getUserName());
		user.setHxId(hxId);
		user.setLevel("0");
		userMapper.saveUserInfo(user);

		UserAccount account = new UserAccount();
		account.setUserId(user.getId());
		account.setLoginId(login.getId());
		account.setBalance(new BigDecimal(0));
		account.setPoints(0);
		userMapper.saveUserAccount(account);
		if (user.getId() < 0) {
			String Data = HttpClientManager.deleteHxUser(hxId);
			JSONObject jsonObjec = JSONObject.fromObject(Data);
			Map<String, Object> mapJso = JSONObject.fromObject(jsonObjec);
			String ur = (String) mapJso.get("uri");
			if (ur != null && !"".equals(ur)) {
				return -2;
			}
		} else {
			return user.getId();
		}
		return -1;
    }

    /**
     * 修改用户的地址，性别，昵称，生日
     */
    @Override
    public void updateAppUser(User user) {
        if (user.getAddress() != null && user.getAddress() != "") {
            userMapper.updateAppAddress(user);
        }
        if (user.getPetName() != null && user.getPetName() != "") {
            userMapper.updateAppPetName(user);
        }
        if (user.getSex() != null && user.getSex() != "") {
            userMapper.updateAppSex(user);
        }
        if (user.getBirthday() != null && user.getBirthday() != "") {
            userMapper.updateAppBirthday(user);
        }
    }

    /**
     * 根据用户id查询用户详情
     */
    @Override
    public User getAppUser(int id) {
        return userMapper.getAppUser(id);
    }

    @Override
    public void updateAppPwd(User user) {
        userMapper.updateAppPwd(user);
    }

    @Override
    public String getAppCode(User user) {
        return userMapper.getAppCode(user);
    }

    /**
     * 根据手机号获取登录表中的信息
     */
    @Override
    public User getLoginId(User user) {
        return userMapper.getLoginId(user);
    }

    /**
     * 根据登录名获取用户id
     */
    @Override
    public String getUserByPhone(User user) {
        return userMapper.getUserByPhone(user);
    }

    /**
     * 根据用户id查询此用户的好友列表
     */
    @Override
    public List<User> getFriendsAll(User user) {

        return userMapper.getFriendsAll(user);
    }

    /**
     * 添加好友
     */
    @Override
    public void saveAppFirend(User user) {
        userMapper.saveAppFirend(user);
    }

    /**
     * 获取当前用户好友的其中一个id （一个用户可以拥有多个好友，一个好友可以归多个用户 所以才需要用户id和好友id一起判断）
     */
    @Override
    public String getFirend(User user) {
        return userMapper.getFirend(user);
    }

    /**
     * 根据手机号或者昵称 获取用户的信息
     */
    @Override
    public List<User> getByPhone(User user) {
        return userMapper.getByPhone(user);
    }

    /**
     * 根据登录用户名获取密码
     */
    @Override
    public String getPwd(User user) {
        return userMapper.getPwd(user);
    }

    /**
     * 互加好友的时候 调用saveAppFirends 和 saveAppFirend这两个方法（两个方法必须要同时调用，提交）
     */
    @Override
    public void saveAppFirends(User user) {
        userMapper.saveAppFirends(user);
    }

    /**
     * 根据用户id获取此用户的手机号码
     */
    @Override
    public String getPhone(String id) {
        return userMapper.getPhone(id);
    }

    /**
     * 根据登录账号 得到支付密码
     */
    @Override
    public String getPayPwd(User user) {
        return userMapper.getPayPwd(user);
    }

    /**
     * 修改支付密码
     */
    @Override
    public void updatePayPwd(int id, String newPwd) {
        UserLogin login = new UserLogin();
        login.setId(id);
        login.setPayPwd(newPwd);
        userMapper.updatePayPwd(login);
    }

    /**
     * 根据手机号获取用户id
     */
    @Override
    public User getUserParams(String phone) {
        return userMapper.getUserParams(phone);
    }

    /**
     * 互删好友
     */
    @Override
    public int deleteFirend(User user) {
        userMapper.deleteFirend1(user);
        return userMapper.deleteFirend(user);
    }

    /**
     * 根据用户id来获取支付密码
     */
    @Override
    public User getPayPwd1(String id) {
        return userMapper.getPayPwd1(id);
    }

    /**
     * 搜索用户（根据手机号码【手机号码完全匹配】 或者是 昵称【昵称模糊匹配】进行搜索）
     * 
     * @author : GeHuanHuan
     * @version : 2017.6.12 10:28:22
     */
    @Override
    public List<User> getByName(User user) {
        return userMapper.getByName(user);
    }

    /**
     * 环信加好友的时候 会在此表中添加一条数据
     * 
     * @author : GeHuanHuan
     * @version : 2017.6.12 10:33:10
     */
    @Override
    public int saveApply(User user) {
        return userMapper.saveApply(user);
    }

    /**
     * 获取好友列表
     * 
     * @author : GeHuanHuan
     * @version : 2017.6.12 10:51:43
     */
    @Override
    public List<User> getApply(User user) {
        return userMapper.getApply(user);
    }

    /**
     * 删除好友
     * 
     * @author : GeHuanHuan
     * @version : 2017.6.12 10:56:22
     */
    @Override
    public void deleteApply(User user) {
        userMapper.deleteApply(user);
    }

    /**
     * 根据手机号判断是否注册过此账号
     * 
     * @author : GeHuanHuan
     * @version : 2017.6.12 11:01:21
     */
    @Override
    public int userIsExists(String phone) {
        try {
            return userMapper.userIsExists(phone);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return 0;
    }

    /**
     * 获取通知的消息
     * 
     * @author : GeHuanHuan
     * @version : 2017.6.12 11:22:18
     */
    @Override
    public List<SMessage> getMessage(User user) {
        return userMapper.getMessage(user);
    }

    /**
     * 消息已经阅读（把消息表的state字段修改为1）
     * 
     * @author : GeHuanHuan
     * @version : 2017年6月12日上午11:24:52
     */
    @Override
    public void updateMessage(String id) {
        SMessage sm = new SMessage();
        sm.setUserId(Integer.parseInt(id));
        userMapper.updateMessage(sm);
    }

    /**
     * 添加好友 确认通过后进行修改（此表中的apply_state字段为1）
     * 
     * @author : GeHuanHuan
     * @version : 2017年6月12日上午11:51:09
     */
    @Override
    public void updateApply(User user) {
        userMapper.updateApply(user);

    }

    /**
     * 根据用户id获取此用户的商户id
     * 
     * @author : GeHuanHuan
     * @version : 2017年6月12日上午11:54:03
     */
    @Override
    public String getBusinessId(int ids) {
        return userMapper.getBusinessId(ids);
    }

    /**
     * 根据id获取商户的详情信息
     * 
     * @author : GeHuanHuan
     * @version : 2017年6月12日上午11:55:31
     */
    @Override
    public BusinessInfo getBusiness(String bid) {
        return userMapper.getBusiness(bid);
    }

    /**
     * 获取好友个数
     * 
     * @author : GeHuanHuan
     * @version : 2017年6月12日上午11:58:25
     */
    @Override
    public int getApplyFirend(User user) {
        return userMapper.getApplyFirend(user);
    }

    /**
     * 根据登录账号 获取登录信息
     * 
     * @author : GeHuanHuan
     * @version : 2017年6月12日下午12:58:52
     */
    @Override
    public UserLogin getUserMes(User use) {
        return userMapper.getUserMes(use);
    }

    /**
     * 根据用户id查询账户信息
     * 
     * @author : GeHuanHuan
     * @version : 2017年6月12日下午1:47:50
     */
    @Override
    public UserAccount getAccount(String userId) {
        return userMapper.getAccount(userId);
    }

    /**
     * 根据登录id查询积分
     * 
     * @author : GeHuanHuan
     * @version : 2017年6月12日下午1:49:21
     */
    @Override
    public String getPoints(String loginId) {
        return userMapper.getPoints(loginId);
    }

    /**
     * 根据账号查询id
     * 
     * @author : GeHuanHuan
     * @version : 2017年6月12日下午1:51:17
     */
    @Override
    public String findByPhonea(UserLogin login) {
        return userMapper.findByPhonea(login);
    }

    /**
     * 通过账号查找用户
     */
    @Override
	public int findByPhone(UserLogin login) {
		return userMapper.findByPhone(login);
	}
    /**
     * 修改积分
     * 
     * @author : GeHuanHuan
     * @version : 2017年6月12日下午1:52:55
     */
    @Override
    public void updatePoints(User u) {
        userMapper.updatePoints(u);
    }


    /**
     * 根据登录账号 获取用户详情表中的id
     * 
     * @author : GeHuanHuan
     * @version : 2017年6月12日下午2:01:36
     */
    @Override
    public Integer getUserInfoByLoginId(int loginId) {
        return userMapper.getUserInfoByLoginId(loginId);
    }

    /**
     * 用户升级为vip用户 在vip用户表中 添加一条信息
     * 
     * @author : GeHuanHuan
     * @version : 2017年6月12日下午2:04:57
     */
    @Override
    public void saveVipDetails(User u) {
        userMapper.saveVipDetails(u);

    }

    /**
     * 升级用户的vip等级
     * 
     * @author : GeHuanHuan
     * @version : 2017年6月12日下午2:07:59
     */
    @Override
    public void updateLevel(User us) {
        userMapper.updateLevel(us);

    }

    /**
     * 根据用户id获取用户的vip等级，冻结金额等信息
     * 
     * @author : GeHuanHuan
     * @version : 2017年6月12日下午2:09:41
     */
    @Override
    public User getUserLevel(int id) {
        return userMapper.getUserLevel(id);
    }


    /**
     * 根据代理人id查询代理的信息个数
     * 
     * @author : GeHuanHuan
     * @version : 2017年6月12日下午1:57:29
     */
    @Override
    public int getIsAgent(int id) {
        return userMapper.getIsAgent(id);
    }

    /**
     * 根据环信id查询用户信息
     * @param login
     * @return
     * @throws Exception
     */
    @Override
	public User appLogin(UserLogin login) {
		return userMapper.appLogin(login);
	}

    /**
     *	环信表中存值
     * @param hx
     * @param id
     * @throws Exception
     */
    @Override
	public void saveAppHx(String hx, int id) {
		User user = new User();
		user.setHxId(hx);
		user.setLoginId(id);
		userMapper.saveHxId(user);
	}
    
    @Override
	public Group getGroupMsg(Group group) {
		return userMapper.getGroupMsg(group);
	}
    
    @Override
	public void updateimageAddress(Integer id, String imageAddress) {
		Group group = new Group();
		group.setId(id);
		group.setHeadImage(imageAddress);
		userMapper.updateGroupImage(group);
	}
    
    @Override
	public User getById(User user) {
		return userMapper.getById(user);
	}
    
    @Override
	public int saveUserReg(UserLogin login,String points) {
		User user = null;
		userMapper.saveUserLogin(login);
		// 添加用户表 hltx_user_info
		user = new User();
		SimpleDateFormat format = new SimpleDateFormat("yyyy");
		String year = format.format(new Date());
		user.setCodePre(year);
		user.setCodeSuf(CustomUtil.buildRandom(3) + "");
		user.setLoginId(login.getId());
		user.setPhone(login.getUserName());
		String petName = user.getPhone().substring(0, 3) + "****"
				+ user.getPhone().substring(user.getPhone().length() - 4, user.getPhone().length());
		user.setPetName(petName);
		user.setAddress("");
		user.setCreationDate("");
		user.setBirthday("");
		if("1000".equals(points)){
			user.setLevel("1");
		}
		if("5000".equals(points)){
			user.setLevel("2");
		}
		userMapper.saveUserInfo(user);
		UserAccount account = new UserAccount();
		account.setUserId(user.getId());
		account.setLoginId(login.getId());
		account.setBalance(new BigDecimal(0));
		account.setPoints(Integer.parseInt(login.getPoint()));
		userMapper.saveUserAccount(account);
		if (login.getFriend() != null) {
			User pUser = new User();
			pUser.setPhone(login.getFriend());
			String parentId = userMapper.getUserByPhone(pUser);
			user.setFirendId(Integer.parseInt(parentId));
			userMapper.saveRelation(user);
		}
		if (user.getLoginId() > 0) {
			return user.getLoginId();
		} else {
			return -1;
		}
	}
    
	@Override
	public String test() {
		// TODO Auto-generated method stub
		return null;
	}

}
